#! usr/bin/env python
### Python 迭代器与生成器

### 迭代器
# 迭代是Python最强大的功能之一，是访问集合元素的一种方式。

# 迭代器是一个可以记住遍历的位置的对象。

# 迭代器对象从集合的第一个元素开始访问，直到所有的元素被访问完结束。迭代器只能往前不会后退。

# 迭代器有两个基本的方法：iter() 和 next()。

# 字符串，列表或元组对象都可用于创建迭代器：(string、list、tuple)
list = [1,2,3,4]
it = iter(list)
# print(it,type(it))
print(next(it))     # 输出迭代器的下一个元素
print(next(it))

print('')

newlist = [1,2,3,4]
its = iter(newlist)
for i in its:
    print(i,end='')

print('\n')


# 也可以使用next（）函数
from re import X
import sys
# from typing_extensions import Self

# list1 = [1,2,3,4,5,6,7]
# it = iter(list1)
# while True:
#     try:
#         print(next(it))
#     except StopIteration:
#         sys.exit()

### 创建一个迭代器
# 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
# 如果你已经了解的面向对象编程，就知道类都有一个构造函数，Python 的构造函数为 __init__(), 它会在对象初始化的时候执行。
# 更多内容查阅：Python3 面向对象
# __iter__() 方法返回一个特殊的迭代器对象， 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
# __next__() 方法（Python 2 里是 next()）会返回下一个迭代器对象。
# 创建一个返回数字的迭代器，初始值为 1，逐步递增 1：

print('创建一个迭代器：')
class MyNumber:
    def __iter__(self):
        self.a = 1
        return self
    def __Str__(self):
        return MyNumber()
    def __next__(self):
        x = self.a
        self.a += 1
        return x
myClass = MyNumber()
myIter = iter(myClass)

print(myClass.__iter__)
print(next(myIter))
print(next(myIter))
print(next(myIter))
print(next(myIter))
print(next(myIter))
